﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Tools.TraceVisualiser.TraceData;
using Noris.Tools.TraceVisualiser.Support;

namespace Noris.Tools.TraceVisualiser.Green.AplServer
{
	public static class FuncLibrary
	{
		/// <summary>
		/// Metoda zajistí, že v datové základně budou načteny všechny soubory TraceInfo, aby daný event měl načten začátek i konec.
		/// To je nutné tehdy, když chceme provádět analýzu dat v době daného eventu, a potřebujeme mít načteny všechny okolní eventy.
		/// </summary>
		/// <param name="eventItem"></param>
		internal static void PrepareTraceInfoForEvent(TraceData.MainInfo main, EventPairItem pairItem, double prevSecond, double afterSeconds)
		{
            // Načíst obsah trace souborů tak, aby daný event měl jistý jak začátek, tak konec:
			if (pairItem.Trace == null && pairItem.TraceEnd != null)
				PrepareTraceInfoForEventBegin(main, pairItem);
			if (pairItem.Trace != null && pairItem.TraceEnd == null)
				PrepareTraceInfoForEventEnd(main, pairItem);

            // Je požadován nějaký kladný přesah? Na to existuje snadná metoda main.CheckLoadContentForTime(TimeRange time):
            if (prevSecond > 0D || afterSeconds > 0D)
            {
                DateTime begin = pairItem.Time.Begin.AddSeconds((prevSecond > 0D) ? -prevSecond : 0D);
                DateTime end = pairItem.Time.End.AddSeconds((afterSeconds > 0D) ? afterSeconds : 0D);
                TimeRange time = new TimeRange(begin, end);
                main.CheckLoadContentForTime(time, null);
            }
            Steward.StatbusBarSetReady();
        }
        /// <summary>
        /// Pokusí se zajistit, že pro daný event bude načten obsah takového trace souboru, který se v eventu objeví jako Begin
        /// </summary>
        /// <param name="main"></param>
        /// <param name="pairItem"></param>
		internal static void PrepareTraceInfoForEventBegin(MainInfo main, EventPairItem pairItem)
		{
			DateTime end = pairItem.Time.End;
			TimeVector vector = new TimeVector(end, TimeRange.TimeDirection.ToHistory);
            while (true)
            {
                TraceInfo traceInfo = main.PrepareNextTraceFiles(ref vector, null);
                if (traceInfo == null) break;

                // Nyní se načetl soubor traceInfo. 
                // Zjistíme, zda se podařilo načíst ten trace soubor, který v sobě nese Begin pro náš Event
                //  (Event je referencí na fyzický objekt v datech, a pak pokud by se načetl jeho Begin, tak by se objevil v objektu referencovaném proměnnou pairItem).
                if (pairItem.Trace != null)
                    break;
            }
		}
        /// <summary>
        /// Pokusí se zajistit, že pro daný event bude načten obsah takového trace souboru, který se v eventu objeví jako End
        /// </summary>
        /// <param name="main"></param>
        /// <param name="pairItem"></param>
		internal static void PrepareTraceInfoForEventEnd(MainInfo main, EventPairItem pairItem)
		{
            DateTime begin = pairItem.Time.Begin;
            TimeVector vector = new TimeVector(begin, TimeRange.TimeDirection.ToFuture);
            while (true)
            {
                TraceInfo traceInfo = main.PrepareNextTraceFiles(ref vector, null);
                if (traceInfo == null) break;

                // Nyní se načetl soubor traceInfo. 
                // Zjistíme, zda se podařilo načíst ten trace soubor, který v sobě nese End pro náš Event
                //  (Event je referencí na fyzický objekt v datech, a pak pokud by se načetl jeho Begin, tak by se objevil v objektu referencovaném proměnnou pairItem).
                if (pairItem.TraceEnd != null)
                    break;
            }
		}
	}
}
